/**
 * 生成随机字符串
 * @param len 字符串长度
 * @returns 随机字符串
 */
export function randomString(len: number = 16): string {
  const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  let result = '';
  for (let i = 0; i < len; i++) {
    result += chars.charAt(Math.floor(Math.random() * chars.length));
  }
  return result;
}

/**
 * 生成格式化的密钥
 * @param primaryPrefix 主前缀
 * @param secondaryPrefix 次前缀
 * @param numericLength 数字部分长度
 * @param randomStringLength 随机字符串长度
 * @returns 格式化的密钥字符串
 */
export function generateFormattedKey(primaryPrefix = 'Publications', secondaryPrefix = 'section', numericLength = 10, randomStringLength = 8): string {
  // 定义允许的字符集（小写字母和数字）
  const charset = 'abcdefghijklmnopqrstuvwxyz0123456789';
  const charsetLength = charset.length;
  
  // 生成随机字符串函数 (使用 Crypto API 增强随机性)
  function generateRandomString(length: number): string {
    // 优先使用更安全的 Crypto API
    if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
      const array = new Uint32Array(length);
      crypto.getRandomValues(array);
      let result = '';
      for (let i = 0; i < length; i++) {
        result += charset[array[i] % charsetLength];
      }
      return result;
    }
    // 备用方案: 使用 Math.random()
    else {
      let result = '';
      for (let i = 0; i < length; i++) {
        result += charset.charAt(Math.floor(Math.random() * charsetLength));
      }
      return result;
    }
  }
  
  // 生成数字部分 (使用时间戳并确保长度)
  function generateNumericPart(length: number): string {
    const timestamp = Date.now().toString();
    // 如果时间戳长度不够，用随机数补齐
    if (timestamp.length >= length) {
      return timestamp.slice(0, length);
    } else {
      const randomDigits = generateRandomString(length - timestamp.length)
        .replace(/[^0-9]/g, '');
      return timestamp + randomDigits;
    }
  }
  
  // 构建密钥各部分
  const numericPart1 = generateNumericPart(numericLength);
  const randomString1 = generateRandomString(randomStringLength);
  const numericPart2 = generateNumericPart(numericLength);
  const randomString2 = generateRandomString(randomStringLength);
  
  // 组合最终密钥
  return `${primaryPrefix}-${numericPart1}-${randomString1}-${secondaryPrefix}-${numericPart2}-${randomString2}`;
}